package util;


import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import javax.swing.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.Kernel;
import java.awt.image.ConvolveOp;
	 
	public class ImageThubHQ {
	 
	    public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException {
	 
	        if (quality < 0 || quality > 1) {
	            throw new IllegalArgumentException("Quality has to be between 0 and 1");
	        }
	 
	        ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
	        Image i = ii.getImage();
	        Image resizedImage = null;
	 
	        int iWidth = i.getWidth(null);
	        int iHeight = i.getHeight(null);
	        int width,height;
	        if (iWidth > iHeight) {
//	            resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
	            width=newWidth;
	            height=(newWidth * iHeight) / iWidth;
	        } else {
//	            resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
	            width=(newWidth * iWidth) / iHeight;
	            height=newWidth;            
	        }
	        if(width>iWidth)
	        	width=iWidth;
	        if(height>iHeight)
	        	height=iHeight;
	        if(width>iWidth && height>iHeight){
//	        	DirMaker dirmaker=new DirMaker();
//	        	dirmaker.copy(originalFile, resizedFile);
	        	return;
	        }
	        
	        resizedImage = i.getScaledInstance(width, height, Image.SCALE_SMOOTH);
	        // This code ensures that all the pixels in the image are loaded.
	        Image temp = new ImageIcon(resizedImage).getImage();
	 
	        // Create the buffered image.
	        BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
	                                                        BufferedImage.SCALE_SMOOTH);
	 
	        // Copy image to buffered image.
	        Graphics g = bufferedImage.createGraphics();
	 
	        // Clear background and paint the image.
	        g.setColor(Color.white);
	        g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
	        g.drawImage(temp, 0, 0, null);
	        g.dispose();
	 
	        // Soften.
	        float softenFactor = 0.05f;
	        float[] softenArray = {0, softenFactor, 0, softenFactor, 1-(softenFactor*4), softenFactor, 0, softenFactor, 0};
	        Kernel kernel = new Kernel(3, 3, softenArray);
	        ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
	        bufferedImage = cOp.filter(bufferedImage, null);
	 
	        // Write the jpeg to a file.
	        FileOutputStream out = new FileOutputStream(resizedFile);
	 
	        // Encodes image as a JPEG data stream
	        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	        
	 
	        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
	        param.setQuality(quality, true);
	        encoder.setJPEGEncodeParam(param);
	        encoder.encode(bufferedImage);
	        out.close();
	       
	    }
	/*
	    // Example usage
	    public static void main(String[] args) throws IOException {
	        File originalImage = new File("D:/temp/11.bmp");
	        resize(originalImage, new File("D:/temp/thub/hq11.bmp"), 300, 1.0f);
	     //   resize(originalImage, new File("/home/username/images/img-resized-350-quality-1.jpg"), 350, 1f);
	    }
	*/
	    public boolean getThub(String src,String dst,int width,float q) {
	        
	        try {
				resize(new File(src), new File(dst), width, q);				
				return true;
			} catch(IOException e){
				e.printStackTrace();
			}
			return false;
	    	
	    }
	    public boolean getThubFromFile(File originalImage,String dst,int width,float q) {
	        
	        try {
				resize(originalImage, new File(dst), width, q);				
				return true;
			} catch(IOException e){
				e.printStackTrace();
			}
			return false;	    	
	    }
	    
	    public boolean zoomOutByRate(String src,String dst,float zoomRate) throws IOException{	    	
	    	resize(new File(src),  new File(dst), zoomRate, 1f);	    		    	
	    	return true;
	    }
	    
	    public static void resize(File originalFile, File resizedFile, float zoomRate, float quality) throws IOException {
	   	 
	        if (quality < 0 || quality > 1) {
	            throw new IllegalArgumentException("Quality has to be between 0 and 1");
	        }
	 
	        ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
	        Image i = ii.getImage();
	        Image resizedImage = null;
	 
	        int iWidth = i.getWidth(null);
	        int iHeight = i.getHeight(null);
	        int width,height;

	        width=Math.round(iWidth*zoomRate);
	        height=Math.round(iHeight*zoomRate);	        
	 
	        resizedImage = i.getScaledInstance(width, height, Image.SCALE_SMOOTH);
	        // This code ensures that all the pixels in the image are loaded.
	        Image temp = new ImageIcon(resizedImage).getImage();
	 
	        // Create the buffered image.
	        BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
	                                                        BufferedImage.SCALE_SMOOTH);
	 
	        // Copy image to buffered image.
	        Graphics g = bufferedImage.createGraphics();
	 
	        // Clear background and paint the image.
	        g.setColor(Color.white);
	        g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
	        g.drawImage(temp, 0, 0, null);
	        g.dispose();
	 
	        // Soften.
	        float softenFactor = 0.05f;
	        float[] softenArray = {0, softenFactor, 0, softenFactor, 1-(softenFactor*4), softenFactor, 0, softenFactor, 0};
	        Kernel kernel = new Kernel(3, 3, softenArray);
	        ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
	        bufferedImage = cOp.filter(bufferedImage, null);
	 
	        // Write the jpeg to a file.
	        FileOutputStream out = new FileOutputStream(resizedFile);
	 
	        // Encodes image as a JPEG data stream
	        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);	        
	 
	        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
	        param.setQuality(quality, true);
	        encoder.setJPEGEncodeParam(param);
	        encoder.encode(bufferedImage);
	        out.close();	       
	    }
	    
	    public void savePhoto(File src,String dst,int width,String thubDst,int thubWidth){
	    	getThubFromFile(src, dst, width, 0.9f);
	    	getThubFromFile(src, thubDst, thubWidth, 1f);
	    }
	    
	public static void main(String args[]){
		ImageThubHQ hq=new ImageThubHQ();
		hq.getThub("D:\\workspace\\AutoTest\\trunk\\others\\note\\WebContent\\img\\yakslogo.jpg",  "D:\\workspace\\AutoTest\\trunk\\others\\note\\WebContent\\img\\yakslogo" + "_0.jpg", 90,
				0.8f);
	}
}
